package com.z.xhelper.core.eventbus;

import com.z.xhelper.core.config.BeanContainer;
import com.z.xhelper.core.config.Reflections;
import com.z.xhelper.core.utils.LogUtil;


import java.util.ArrayList;
import java.util.Arrays;

/**
 * 一个简单的事件总线
 * 可以按照不同的事件类型注册不同的监听器
 * 当事件发生时，通知所有的监听器
 * todo: 1.支持粘性事件
 *       2.支持异步事件
 *       3.支持事件优先级
 */
public class EventBus {
    private final ContextFactory<IListener<IEvent>> eventContext = new ContextFactory<>();


    public EventBus() {
        // 注册监听者到 eventbus 中
        Reflections reflections = BeanContainer.getBean(Reflections.class);
        if (reflections == null) {
            LogUtil.log("reflections is null");
            return;
        }

        // 注册所有的 IListener 的实现类
        reflections.getSubTypesOf(IListener.class).forEach(clazz -> {
            try {
                IListener listener = clazz.newInstance();
                // 注册到 eventbus 中
                eventContext.register(listener.getEventName(), listener);
            } catch (InstantiationException | IllegalAccessException e) {
                LogUtil.log("注册事件监听者失败" + Arrays.toString(e.getStackTrace()));
            }
        });
    }


    public void post(IEvent event) {
        LogUtil.log("post: " + event.getEventName() + " " + event.getContext());
        ArrayList<IListener<IEvent>> listener = eventContext.getContextMap(event.getEventName());
        LogUtil.log("listener: " + listener.size());
        for (IListener<IEvent> iListener : listener) {
            iListener.run(event);
        }
    }

}